package study

import "fmt"

func Base() {
	// 对于整数, 有四种表示方式
	// 1.二进制: 由 01 表示
	//   在 go 中, 不能直接以二进制表示一个数值, 以二进制输出时使用 %b
	a := 12
	fmt.Printf("a=%v, a 的二进制表示: %b\n", a, a)
	// 2.八进制: 由 0~7 表示, 以数字 0 开头
	b := 012
	fmt.Printf("b=%v, b 的八进制表示: %o\n", b, b)
	// 3.十进制: 由 0~9 表示
	// 4.十六进制: 由 0~f 表示, 以 0X 或 0x 表示
	d := 0x11
	fmt.Printf("b=%v, b 的十六进制表示: %x\n", d, d)

	// --------------------------------------------------- 原码, 反码, 补码 ---------------------------------------------------
	// 1.对于有符号数而言, 最高位是符号位, 0 表示整数, 1 表示负数
	// 2.正数的原码, 反码, 补码都一样
	// 3.负数的反码 = 原码按位取反(符号位不变)
	// 4.负数的补码 = 反码 + 1
	// 5.0 的反码, 补码都是 0
	// 6.计算机以补码方式进行运算(减法以加法运算, 乘除以位移方式运算)
	// 原码         反码         补码
	// 00000000 => 00000000 => 00000000 // 0
	// 00010001 => 00010001 => 00010001 // 正数
	// 10010001 => 11101110 => 11101111 // 负数

	// --------------------------------------------------- 进制之间的转换 ---------------------------------------------------
	// 二进制转十进制
	// 八进制转十进制
	// 十六进制转十进制
	// 1001 = 1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 1 * 2^3 = 9
	// 0106 = 6 * 8^0 + 0 * 8^1 + 1 * 8^2 = 64 + 6 = 70
	// 0xa1 = 1 * 16^0 + 10 * 16^1 = 161

	// 十进制转二进制
	// 十进制转八进制
	// 十进制转十六进制
	// 1001 = 1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 1 * 2^3 = 9
	// 0106 = 6 * 8^0 + 0 * 8^1 + 1 * 8^2 = 64 + 6 = 70
	// 0xa1 = 1 * 16^0 + 10 * 16^1 = 161

	// 二进制转八进制
	// 二进制转十六进制
	// 1001 = 011
	// 10001001 = 0x89

	// 八进制转二进制
	// 十六进制转二进制
	// 015 = 1101
	// 0xa5 = 10100101
}
